package org.example;

// 导入所需的类和接口
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;
import java.util.logging.Logger;

// 使用@WebListener注解声明这是一个Web监听器，它将自动被Servlet容器识别和注册
@WebListener
public class RequestLoggingListener implements ServletRequestListener {

    // 创建一个Logger实例，用于记录日志信息
    private static final Logger LOGGER = Logger.getLogger(RequestLoggingListener.class.getName());

    // 当ServletRequest事件发生时，此方法被调用
    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        // 将ServletRequestEvent中的ServletRequest转换为HttpServletRequest
        HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();

        // 获取当前时间戳，用于记录请求开始的时间
        long startTime = System.currentTimeMillis();
        // 将开始时间作为属性设置在请求对象上，以便在请求销毁时使用
        request.setAttribute("startTime", startTime);

        // 构建日志消息，包含请求的详细信息
        String logMessage = String.format("Request 初始化: 时间: %d, IP: %s, 方法: %s, URI: %s, Query: %s, User-Agent: %s",
                startTime,
                request.getRemoteAddr(), // 获取请求的IP地址
                request.getMethod(), // 获取请求方法（如GET或POST）
                request.getRequestURI(), // 获取请求的URI
                request.getQueryString(), // 获取请求的查询字符串
                request.getHeader("User-Agent") // 获取请求的User-Agent头部信息
        );

        // 使用Logger记录日志信息
        LOGGER.info(logMessage);
    }

    // 当ServletRequest事件结束时，此方法被调用
    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        // 将ServletRequestEvent中的ServletRequest转换为HttpServletRequest
        HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();
        // 从请求对象的属性中获取之前设置的开始时间
        long startTime = (Long) request.getAttribute("startTime");
        // 获取当前时间戳，用于计算请求处理的总时间
        long endTime = System.currentTimeMillis();
        // 计算请求处理的持续时间
        long duration = endTime - startTime;

        // 构建日志消息，包含请求处理的持续时间
        String logMessage = String.format("Request Destroyed: 处理用时: %d ms", duration);
        // 使用Logger记录日志信息
        LOGGER.info(logMessage);
    }
}